home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
60
/
60.xpi
/
chrome
/
webdeveloper.jar
/
content
/
webdeveloper
/
common
/
validation
/
css.js
< prev
next >
Wrap
Text File
|
2009-06-30
|
10KB
|
269 lines
// Constructs a validate CSS object
function WebDeveloperValidateCSS()
{
this.file = null;
this.validationRequest = null;
}
// Cleans up
WebDeveloperValidateCSS.prototype.cleanUp = function()
{
// If the file is set
if(this.file)
{
// Try to delete the file
try
{
this.file.remove(false);
}
catch(exception)
{
// Do nothing
}
this.file = null;
}
// If the validation request is set
if(this.validationRequest)
{
this.validationRequest.abort();
}
}
// Creates a source file
WebDeveloperValidateCSS.prototype.createSourceFile = function(uri)
{
var temporaryDirectory = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile);
// If the temporary directory exists, is a directory and is writable
if(temporaryDirectory.exists() && temporaryDirectory.isDirectory() && temporaryDirectory.isWritable())
{
var fileName = "";
var sourceFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
// Try to get the host
try
{
fileName = uri.host;
}
catch(exception)
{
// Do nothing
}
temporaryDirectory.append("webdeveloper-" + fileName + "-" + new Date().getTime() + ".css");
sourceFile.initWithPath(temporaryDirectory.path);
return sourceFile;
}
else
{
webdeveloper_error(document.getElementById("webdeveloper-string-bundle").getFormattedString("webdeveloper_tempDirectoryFailed", [temporaryDirectory.path]));
return null;
}
}
// Parses the validation results by type
WebDeveloperValidateCSS.prototype.parseValidationResultsByType = function(type)
{
var count = 0;
var resultsHTML = this.validationRequest.responseText;
var startPosition = resultsHTML.indexOf('<div id="' + type + '">');
// If the start position is greater than 0
if(startPosition > 0)
{
var endPosition = resultsHTML.indexOf("</div>", startPosition);
// If the end position is greater than 0
if(endPosition > 0)
{
count = resultsHTML.slice(startPosition, endPosition).split("<li>").length;
}
}
// If the count is greater than 0
if(count > 0)
{
return count - 1;
}
return 0;
}
// Retrieves the CSS for the given document list
WebDeveloperValidateCSS.prototype.retrieveCSS = function(documentList)
{
var documentLength = documentList.length;
var documentURL = null;
var pageDocument = null;
var stringBundle = document.getElementById("webdeveloper-string-bundle");
var styleSheet = null;
var styleSheetHref = null;
var styleSheetLength = null;
var styleSheetList = null;
var styleText = "";
var styleElement = null;
// Loop through the documents
for(var i = 0; i < documentLength; i++)
{
pageDocument = documentList[i];
documentURL = pageDocument.documentURI;
styleSheetList = pageDocument.getElementsByTagName("style");
styleSheetLength = styleSheetList.length;
// Loop through the style sheets
for(var j = 0; j < styleSheetLength; j++)
{
styleElement = styleSheetList[j];
styleSheet = styleElement.sheet;
// If this is a valid style sheet
if(webdeveloper_isValidStyleSheet(styleSheet))
{
styleText += "/* " + stringBundle.getFormattedString("webdeveloper_embeddedStylesFrom", [styleSheet.href]) + " */\n\n";
styleText += styleElement.innerHTML.trim() + "\n\n";
}
}
styleSheetList = webdeveloper_getStyleSheetsForDocument(pageDocument, true, true);
styleSheetLength = styleSheetList.length;
// Loop through the style sheets
for(j = 0; j < styleSheetLength; j++)
{
styleSheetHref = styleSheetList[j].href;
// If this is not an inline style sheet
if(styleSheetHref && styleSheetHref != documentURL)
{
styleText += webdeveloper_retrieveSource(styleSheetHref);
}
}
}
return styleText;
}
// Validate the CSS from the given URI and document list in the background
WebDeveloperValidateCSS.prototype.validateBackgroundCSS = function(uri, documentList)
{
var boundaryString = new Date().getTime();
var boundary = "--" + boundaryString;
var requestBody = boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"css.css\"\r\n";
// If the validation request is not set
if(!this.validationRequest)
{
this.validationRequest = new XMLHttpRequest();
}
this.validationRequest.onreadystatechange = webdeveloper_updatePageCSSValidationDetails;
requestBody += "Content-Type: text/css\r\n\r\n";
requestBody += this.retrieveCSS(documentList) + "\r\n";
requestBody += boundary + "\r\n";
requestBody += "Content-Disposition: form-data; name=\"profile\"\r\n\r\n" + webdeveloper_getStringPreference("webdeveloper.validate.local.css.profile", true) + "\r\n";
requestBody += boundary + "\r\n";
requestBody += "Content-Disposition: form-data; name=\"usermedium\"\r\n\r\nall\r\n";
requestBody += boundary + "\r\n";
requestBody += "Content-Disposition: form-data; name=\"warning\"\r\n\r\n0\r\n";
requestBody += boundary + "--";
this.validationRequest.open("post", "http://jigsaw.w3.org/css-validator/validator", true);
// Try to set the request header
try
{
this.validationRequest.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundaryString);
this.validationRequest.send(requestBody);
}
catch(exception)
{
// Reset the validation request
this.validationRequest = new XMLHttpRequest();
}
}
// Validate the CSS from the given URI and document list
WebDeveloperValidateCSS.prototype.validateCSS = function(uri, documentList)
{
var oldTab = getBrowser().selectedTab;
var generatedDocument = webdeveloper_generateDocument("");
var bodyElement = webdeveloper_getDocumentBodyElement(generatedDocument);
var formElement = generatedDocument.createElement("form");
var imageElement = generatedDocument.createElement("img");
var inputElement = null;
var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
var pElement = generatedDocument.createElement("p");
var scriptElement = generatedDocument.createElement("script");
var stringBundle = document.getElementById("webdeveloper-string-bundle");
var styleText = null;
generatedDocument.title = stringBundle.getString("webdeveloper_validateCSS");
this.file = this.createSourceFile(uri);
webdeveloper_addGeneratedStyles(generatedDocument);
imageElement.setAttribute("alt", "loading");
imageElement.setAttribute("src", "chrome://webdeveloper/content/images/content/loading.gif");
pElement.appendChild(imageElement);
pElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_contactingValidator")));
pElement.setAttribute("class", "loading");
bodyElement.appendChild(pElement);
styleText = this.retrieveCSS(documentList);
this.file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 00644);
outputStream.init(this.file, 0x04 | 0x08 | 0x20 | 0x40, 00644, null);
outputStream.write(styleText, styleText.length);
outputStream.close();
formElement.setAttribute("action", "http://jigsaw.w3.org/css-validator/validator");
formElement.setAttribute("enctype", "multipart/form-data");
formElement.setAttribute("method", "post");
formElement.setAttribute("style", "display: none");
inputElement = generatedDocument.createElement("input");
inputElement.setAttribute("name", "profile");
inputElement.setAttribute("type", "hidden");
inputElement.setAttribute("value", webdeveloper_getStringPreference("webdeveloper.validate.local.css.profile", true));
formElement.appendChild(inputElement);
inputElement = generatedDocument.createElement("input");
inputElement.setAttribute("name", "usermedium");
inputElement.setAttribute("type", "hidden");
inputElement.setAttribute("value", "all");
formElement.appendChild(inputElement);
inputElement = generatedDocument.createElement("input");
inputElement.setAttribute("name", "warning");
inputElement.setAttribute("type", "hidden");
inputElement.setAttribute("value", "0");
formElement.appendChild(inputElement);
inputElement = generatedDocument.createElement("input")
inputElement.setAttribute("name", "file");
inputElement.setAttribute("type", "file");
inputElement.value = this.file.path;
formElement.appendChild(inputElement);
bodyElement.appendChild(formElement);
formElement.submit();
// If the open tabs in background preference is set to true
if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs.background", true))
{
getBrowser().selectedTab = oldTab;
}
}